"""
author：fc
date：  2021/11/8
"""
import json
import os
import matplotlib.pyplot as plt
import numpy as np

"""
# 个人兴趣度会随时间变化而变化，也就是说不同时间段用户的兴趣不同，不同的性别不同的年龄在不同的时间兴趣度也不一样
数据集为奈飞netflix的电影评分，
只针对了一个用户（uid=1086360）对电影的月平均评分，它表现是的用户对电影评分的变化趋势，主题是用户
"""
class Demo:
    def __init__(self,filePath):
        self.dataPath = filePath
        self.users=['1086360']
        self.item=['80']

    def showPerson(self):
        userItemRate = dict()
        jsonPath = "json/userItemRate.json"
        if os.path.exists(jsonPath):
            userItemRate = json.load(open(jsonPath, "r"))
            print("userItemRate Load Ok !")
        else:
            # 遍历文件夹下的每一个文件
            for file in os.listdir(self.dataPath):
                onePath = "{}/{}".format(self.dataPath,file)
                print(onePath)
                for line in open(onePath,"r").readlines():
                    if not line.endswith(":") and line.strip().split(",")[0] in self.users:  # 跳过首行，去除收尾空格然后切割
                        userId,rate,date = line.strip().split(",")
                        userItemRate.setdefault(userId,{})
                        newDate = "".join(date.split("-")[:2])
                        userItemRate[userId].setdefault(newDate,[]).append(int(rate))   # 有则添加，无则新建

            # 计算每个月的平均分
            for uid in userItemRate.keys():
                for date in userItemRate[userId].keys():
                    userItemRate[uid][date] = round(sum(userItemRate[uid][date])/len(userItemRate[uid][date]),2)
            json.dump(userItemRate, open("json/userItemRate.json", "w"))
            print("userItemRate Message saved Ok !")
        return userItemRate

    def showPicture(self,_dict,label):
        plt.rcParams['font.sans-serif']=['SimHei'] # 用来显示正常中文标签
        plt.rcParams['axes.unicode_minus']=False # 用来正常显示负号
        newDict=sorted(_dict.items(),key=lambda x :x[0],reverse=False) # false->升序，
        x=[one[0] for one in newDict]
        y=[one[1] for one in newDict]
        plt.plot(x,y,marker="o",label=label)
        plt.xticks(np.arange(len(x),step=2),rotation=90) # 横坐标刻度
        plt.xlabel(u'时间-单位/月')
        plt.ylabel(u"平均打分/月")
        plt.title(u"平均评分随时间的变化")
        plt.legend()
        plt.show()

if __name__ == '__main__':
    filePath = "./data/netflix/training_set"
    # 测试网飞数据集中uid=1086360的用户在2002年到2005年12月之间的个人对电影兴趣度随时间的变化趋势
    demo= Demo(filePath)
    userItemRate=demo.showPerson()
    print(userItemRate)

    demo.showPicture(userItemRate[demo.users[0]],'uid=1086360')